<!DOCTYPE html>
<html>
<head>
	<title></title>
	<link rel="stylesheet" type="text/css" href="../公用CSS文件/all.css" />
	<script type="text/javascript" src="../js/jquery.min.js"></script> 	<script type="text/javascript" src="../js/js.js"></script>
	<meta charset="utf-8">
	<style type="text/css">
		table,td,th{text-align: center;padding:5px!important;}
	</style>
</head>
<body>

<div class="dt">微信支付发起和流程</div>
<ul>
	<div class="ltable showimg">Api流程对比</div>
	<div class="img">
		<table align="center">
			<tr>
				<th>对比栏目</th>
				<th>JSAPI支付</th>
				<th>小程序</th>
				<th>H5支付</th>
				<th>扫码支付</th>
				<th>App支付</th>
			</tr>
			<tr>
				<th>应用场景</th>
				<td>微信客户端</td>
				<td>微信客户端</td>
				<td>微信外手机浏览器</td>
				<td>任何场景</td>
				<td>安卓、ISO原生APP</td>
			</tr>
			<tr>
				<th>统一下单</th>
				<td colspan="5">参数一致，只有trade_type的值有差别，也会根据该值返回差异的结果</td>
			</tr>
			<tr>
				<th>调起支付数据签名</th>
				<td colspan="2">五个字段参与签名(区分大小写)：appId,nonceStr,package,signType,timeStamp</td>
				<td colspan="2">无此步骤</td>
				<td>六个字段参与签名，增加了partnerid商户号、prepayid支付ID，减少了signType</td>
			</tr>
			<tr>
				<th>协议要求</th>
				<td colspan="5">无要求(仅小程序要求HTTPS，但小程序不需要支付目录和授权域名)</td>
			</tr>
			<tr>
				<th>授权域名</th>
				<td colspan="5">JSAPI需要授权目录，H5需要授权目录</td>
			</tr>
			<tr>
				<th>结果反馈</th>
				<td colspan="5">JS发起由JS处理，使用官方SDK的按规范处理。扫码、H5不在服务商页面操作，无法获取请求结果，但可以等待付款结果通知</td>
			</tr>
		</table>
		<li>官方的JSAPI的SDK仅有成功回调，小程序SDK有complete、success、fail回调</li>
		<li>小程序支付和JSAPI的本质区别是小程序其实是访问的微信服务器自己的资源，因为发起时域名在微信端，所以不需要支付目录</li>
		<li>prepay_id其实类似于微信方的支付订单id</li>
	</div>

	<div class="ltable showimg">Api流程简述</div>
	<div class="img">
		<table align="center">
			<tr>
				<th>支付方式</th><th>说明</th>
			</tr>
			<tr>
				<td>JSAPI支付</td>
				<td>通过统一下单生成预支付订单，成功后拿到prepay_id然后签名传递给前端，通过JSSDK发起支付，JS能获取请求发送结果，在结果出来后微信也会异步通知统一下单设置的回调通知地址</td>
			</tr>
			<tr>
				<td>小程序支付</td>
				<td>同JSAPI一致，只是调用支付时的JS不一致，JsApi只有一个success回调，而小程序有complete、success、fail</td>
			</tr>
			<tr>
				<td>H5支付</td>
				<td>通过统一下单生成预支付订单，成功后拿到mweb_url，用户访问此地址唤起微信客户端功能，在结果出来后微信也会异步通知统一下单设置的回调通知地址</td>
			</tr>
			<tr>
				<td>扫码支付</td>
				<td>通过统一下单生成预支付订单，成功后拿到code_url，生成该url的二维码，用户扫码唤起微信功能，在结果出来后微信也会异步通知统一下单设置的回调通知地址</td>
			</tr>
			<tr>
				<td>App支付</td>
				<td>通过统一下单生成预支付订单，成功后拿到prepay_id然后签名传递给前端，通过安卓或IOS代码发起支付，前端应该能获取请求发送结果，在结果出来后微信也会异步通知统一下单设置的回调通知地址</td>
			</tr>
		</table>
	</div>

	<div class="ltable showimg">统一下单和返回</div>
	<div class="img">
		<table>
			<tr>
				<th>支付方式</th><th>trade_type的值</th><th>必填参数列表</th><th>返回</th>
			</tr>
			<tr>
				<td>JSAPI支付</td>
				<td>JSAPI</td>
				<td>appid、mch_id、nonce_str、notify_url、trade_type、openid<br/>body、out_trade_no、total_fee、spbill_create_ip、sign</td>
				<td>通信和操作结果return_code、result_code，供对比验矫的appid、mch_id、nonce_str、sign，以及trade_type、prepay_id</td>
			</tr>
			<tr>
				<td>小程序支付</td>
				<td>JSAPI</td>
				<td>和JSAPI完全一致</td>
				<td>和JSAPI完全一致</td>
			</tr>
			<tr>
				<td>H5支付</td>
				<td>MWEB</td>
				<td>类似JSAPI，openid非必填，多一个必填字段scene_info</td>
				<td>类似JSAPI，操作成功后多返回mweb_url字段</td>
			</tr>
			<tr>
				<td>扫码支付</td>
				<td>NATIVE</td>
				<td>类似JSAPI，openid非必填</td>
				<td>类似JSAPI，操作成功后多返回code_url字段(用JS转换为二维码)</td>
			</tr>
			<tr>
				<td>APP支付</td>
				<td>APP</td>
				<td>类似JSAPI，openid非必填</td>
				<td>类似JSAPI，返回同样的字段</td>
			</tr>
		</table>
		<li>scene_info在h5支付中为必填字段{"h5_info": "h5_info"{"type":"",//场景类型 "wap_url": "",//WAP网站URL地址 "wap_name": ""//WAP 网站名}}</li>
	</div>

	<div class="ltable showimg">再次签名</div>
	<div class="img">
		<table>
			<tr>
				<th>支付方式</th>
				<th>签名字段</th>
				<th>后续流程</th>
			</tr>
			<tr>
				<td>JSAPI支付</td>
				<td>appId公众号id、timeStamp时间戳、nonceStr随机32位字串<br>package值"prepay_id=数据"，signType加密方式</td>
				<td>由微信内置的wx.requestPayment方法使用签名数据发起支付，</td>
			</tr>
			<tr>
				<td>小程序支付</td>
				<td>与JSAPI一致</td>
				<td>由微信内置的WeixinJSBridge对象的invoke方法使用签名数据发起支付(无appid字段)</td>
			</tr>
			<tr>
				<td>H5支付</td>
				<td>无此步骤</td>
				<td>统一下单后获取mweb_url，用户访问该url唤起支付</td>
			</tr>
			<tr>
				<td>扫码支付</td>
				<td>无此步骤</td>
				<td>统一下单后获取code_url字段转换为二维码，用户扫码发起支付</td>
			</tr>
			<tr>
				<td>App支付</td>
				<td>appId、timeStamp、nonceStr、package值Sign=WXPay，prepayid交易会话id、partnerid商户号</td>
				<td>将签名数据传递至前端，由安卓或者IOS代码发起支付</td>
			</tr>
		</table>	
	</div>
</ul>

<div class="dt">微信支付结果处理</div>
<ul>
	<div class="ltable showimg">微信异步通知处理</div>
	<div class="img">
		<table>
			<tr>
				<th>应用场景</th>
				<td>支付完成后，微信会把相关支付结果及用户信息通过数据流的形式发送给商户，商户需要接收处理，并按文档规范返回应答</td>
			</tr>
			<tr>
				<th>通知说明</th>
				<td>后台通知交互时，如果微信收到商户的应答不符合规范或超时，微信会判定本次通知失败，重新发送最多10次通知</td>
			</tr>
			<tr>
				<th>数据和格式</th>
				<td>基础返回return_code和return_msg，支付结果信息result_code、err_code、err_code_des，成功时返回transaction_id和下单时的请求信息，以及额外的is_subscribe、bank_type、time_end等信息</td>
			</tr>
			<tr>
				<th>结果处理</th>
				<td>一般操作为验证通信、验证结果、然后返回给业务逻辑处理，严格的需要验矫sign是否和商户秘钥组合其他信息生成的一致</td>
			</tr>
			<tr>
				<th>应答</th>
				<td>微信通知统一应答模式，xml数据、返回return_code、return_msg字段</td>
			</tr>
		</table>
		<li>一般支付结果会在24小时4分钟内通知，如果未收到通知或者支付状态未明，官方的建议是主动查询订单</li>
	</div>

	<div class="ltable showimg">查询订单</div>
	<div class="img">
		<table>
			<tr>
				<th>选项</th><th>说明</th>
			</tr>
			<tr>
				<td>接口地址</td>
				<td>https://api.mch.weixin.qq.com/pay/orderquery</td>
			</tr>
			<tr>
				<td>请求参数</td>
				<td>appid、	mch_id、transaction_id、out_trade_no、nonce_str、sign</td>
			</tr>
			<tr>
				<td>返回结果</td>
				<td>通信字段return_code、return_msg，业务结果result_code、err_code、err_code_des，归属字段appid、mch_id、opneid，业务信息trade_state、trade_state_desc、total_fee、transaction_id、out_trade_no，验矫附加字段sign、nonce_str</td>
			</tr>
			<tr>
				<td>一般处理</td>
				<td>验矫通信结果、验矫业务、验矫交易(是退款REFUND、支付SUCCESS还是关闭CLOSED、支付失败PAYERROR、USERPAYING支付中、NOTPAY、REVOKED撤销)，验矫签名，返回业务处理</td>
			</tr>
		</table>
	</div>
</ul>

<div class="dt">其他支付操作</div>
<ul>
	<div class="ltable showimg">关闭订单</div>
	<div class="img">
		<table>
			<tr>
				<th>选项</th><th>说明</th>
			</tr>
			<tr>
				<td>应用场景</td>
				<td>商户订单支付失败需要生成新单号重新发起支付，要对原订单号调用关单，避免重复支付；系统下单后，用户支付超时，系统退出不再受理，避免用户继续，请调用关单接口。</td>
			</tr>
			<tr>
				<td>接口地址</td>
				<td>https://api.mch.weixin.qq.com/pay/closeorder</td>
			</tr>
			<tr>
				<td>请求参数</td>
				<td>appid、mch_id、out_trade_no、nonce_str、sign</td>
			</tr>
			<tr>
				<td>返回结果</td>
				<td>通信字段return_code、return_msg<br/>业务字段result_code、result_msg、err_code、err_code_des<br/>归属字段appid、mch_id，签名验矫nonce_str、sign</td>
			</tr>
		</table>
		<li>错误码描述ORDERPAID订单已支付、SYSTEMERROR	系统错误、ORDERCLOSED订单已关闭、SIGNERROR签名错误、REQUIRE_POST_METHOD请使用post方法、XML_FORMAT_ERROR为XML格式错误</li>
	</div>

	<div class="showimg ltable">申请退款(订单原路返回)</div>
	<div class="img">
		<table>
			<tr>
				<th>选项</th><th>说明</th>
			</tr>
			<tr>
				<td>接口地址</td>
				<td>https://api.mch.weixin.qq.com/secapi/pay/refund</td>
			</tr>
			<tr>
				<td>请求参数</td>
				<td>appid、mch_id、nonce_str、sign、transaction_id【out_trade_no】、out_refund_no、total_fee、refund_fee</td>
			</tr>
			<tr>
				<td>返回结果</td>
				<td>通信字段return_code、return_msg<br/>业务字段result_code、err_code、err_code_des<br/>归属字段appid、mch_id、	appid<br/>订单信息字段transaction_id、out_trade_no、out_refund_no、refund_id、refund_fee、total_fee、cash_fee现金<br/>签名字段nonce_str、sign</td>
			</tr>
			<tr>
				<td>结果处理</td>
				<td>验矫通信、验矫业务，因为交易结果不是返回此处所以一般只到这里，严格的可以去验矫签名、验矫订单信息</td>
			</tr>
		</table>
		<li>退款时传递的参数transaction_id和out_trade_no必须二选一，out_refund_no为自定义的商户退款单号</li>
	</div>

	<div class="ltable showimg">退款结果通知</div>
	<div class="img">
		<table>
			<tr>
				<th>选项</th><th>说明</th>
			</tr>
			<tr>
				<td>应用场景</td>
				<td>当商户申请的退款有结果后，微信会把相关结果发送给商户，商户需要接收处理，并返回应答</td>
			</tr>
			<tr>
				<td>数据说明</td>
				<td>通信字段return_code、return_msg<br/>归属字段appid、mch_id、nonce_str<br/>加密字段req_info<br/>解密后字段：交易字段refund_status、refund_fee、total_fee、out_refund_no、refund_id、out_trade_no、transaction_id</td>
			</tr>
			<tr>
				<td>字段解密</td>
				<td>对加密串A做base64解码，得到加密串B、对商户key做md5，得到32位小写key*、用key*对加密串B做AES-256-ECB解密(自写的还未验证)</td>
			</tr>
			<tr>
				<td>结果处理</td>
				<td>验矫通信、验矫归属、解密信息、验矫结果，返回结果至业务逻辑</td>
			</tr>
			<tr>
				<th>应答</th>
				<td>微信通知统一应答模式，xml数据、返回return_code、return_msg字段</td>
			</tr>
		</table>
	</div>
</ul>


</body>
</html>

